<?php
/**
 * 飞行行为接口，
 * 只要是飞，都得找它
 */
interface FlyBehavior {
	// 飞行行为
	function fly();
} // END inter FlyBehavior

/**
 * 叫行为接口，
 * 不管你是哭爹还是喊娘，还是得找它
 */
interface QuackBehavior {
	// 叫行为
	function quack();
} // END inter QuackBehavior

/**
 * 随风而飞，燕雀怎知鸿鹄之志
 */
class FlyWithWings implements FlyBehavior {
	/**
	 * @see FlyBehavior::fly()
	 *
	 */
	function fly() {
		echo "FlyWithWngs<br />";
	}
} // END class FlyWithWings

/**
 * 根本不会飞，瘟鸡一只
 */
class FlyNoWay implements FlyBehavior {
	/**
	 * @see FlyBehavior::fly()
	 *
	 */
	function fly() {
		echo "FlyNoWay<br />";
	}
} // END class FlyNoWay

/**
 * 鸭子呱呱叫，癞蛤蟆想吃天鹅肉 [这里用TQuack代替Quack::PHP对大小写不敏感]
 */
class TQuack implements QuackBehavior {
	/**
	 * @see QuackBehavior::quack()
	 *
	 */
	function quack() {
		echo "Quack<br />";
	}
} // END class Quack

/**
 * 橡皮鸭吱吱叫，鼠辈横行
 */
class Squeak implements QuackBehavior {
	/**
	 * @see QuackBehavior::quack()
	 *
	 */
	function quack() {
		echo "Squeak<br />";
	}
} // END class Squeak

/**
 * 哑巴，多么想说话呀
 */
class MuteQuack implements QuackBehavior {
	/**
	 * @see QuackBehavior::quack()
	 *
	 */
	function quack() {
		echo "MuteQuack<br />";
	}
} // END class MuteQuack

/**
 * 鸭子类
 * 你一定要说鸳鸯也行，实在不行就搞个鸟类
 */
abstract class Duck {
	public $quackBehavior; //叫嚣接口变量
	public $flyBehavior; //飞翔接口变量
	
	/**
	 * 构造函数
	 * Shit！ 竟然没事干
	 */
	public function __construct() {
	}
	
	/**
	 * 鸭子不出意外，天生就可以“游泳”
	 */
	public function swim() {
		echo "<span style=\"color:red;\">Duck::</sapn>I belive i can swim.<br />";
	} // END func swim

	/**
	 * 爱美之心鸭皆有之 [原版这里是一个虚函数]
	 */
	abstract public function display();// {
		//echo "<span style=\"color:red;\">Duck::</sapn>My dream is be a swan.<br />";
	//} //END func display
	
	/**
	 * 鸭子可叫乎？然异也
	 *
	 * @param QuackBehavior $quackBehavior
	 */
	public function perfromQuack() {
		$this->quackBehavior->quack(); //“叫”就一个字		
	} // END func perfromQuack

	/**
	 * 超人鸭 是可以飞的
	 *
	 * @param FlyBehavior $flyBehavior
	 */
	public function perfromFly() {
		$this->flyBehavior->fly(); //即使打飞机也要表现得很豪迈
	} //END func performFly
	
	/**
	 * 设置飞行接口，于是从这一刻起飞机就变得多样化了
	 */
	public function setFlyBehavior(FlyBehavior $fb) {
		$this->flyBehavior = $fb;
	} //END func setFlyBehavior
	
	/**
	 * 设置叫接口类型，然后成就了“口技”
	 */
	public function setQuackBehavior(QuackBehavior $qb) {
		$this->quackBehavior = $qb;
	} //END func setQuackBehavior
} //END class Duck

/**
 * 这是一只野鸭，
 * 野鸭总比家鸭好吃 ── 小心传染病（例如：非典、口蹄疫……）
 */
class MallardDuck extends Duck {
	
	/**
	 * 构造野鸭，先孵蛋再喂食……
	 */
	public function __construct() {
		$this->quackBehavior = new TQuack(); //曾记否：呱呱叫
		$this->flyBehavior = new FlyWithWings(); //I belive i can fly. ^_^
	} //END func __construct
	
	/**
	 * @see Duck::display()
	 * 重载display，说明一下这是只特立独行的鸭子
	 */
	public function display() {
		echo "<span style=\"blue;\">MallardDuck::</span>I'm a real Mallard duck.";
	} // END func display
} // class MallardDuck

/**
 * 这是一只模型鸭
 * 玩具 or 玩偶 or 玩家 ？？？
 */
class ModelDuck extends Duck {
	/**
	 * 铸模->成型->包装->出货
	 */
	public function __construct() {
		$this->flyBehavior = new FlyNoWay(); //模型鸭是不会飞的
		$this->quackBehavior = new TQuack(); //1块钱店里的东西都会叫，何况这个“高”科技
	}
	
	public function display() {
		echo "<span style=\"blue;\">ModelDuck::</span>I'm a Model duck.";
	}
} //END class ModelDuck

/**
 * 使用接口后的变态类： 火箭推进器
 */
class FlyRocketPowered implements FlyBehavior {
	/**
	 * @see FlyBehavior::fly()
	 *
	 */
	function fly() {
		echo "I'm flying with a rocket!<br />";
	}
} //END class FlyRocketPowered


?>
<h3>测试第一组：野鸭</h3>
<?php
/**
 * 最后，来点绿的，Come On ...
 */
$first_duck = new MallardDuck();
$first_duck->perfromQuack();
$first_duck->perfromFly();
unset($first_duck);
?>
<br /><h3>第二组测试：模型鸭</h3>
<?php
/**
 * 这个就是红的了，污染环境
 */
$second_duck = new ModelDuck();
$second_duck->perfromFly();
$second_duck->setFlyBehavior(new FlyRocketPowered());
$second_duck->perfromFly();
unset($second_duck);
?>